/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logic;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.midi.SysexMessage;
import javax.swing.JOptionPane;

/**
 *
 * @author Nico Clase utilizada para generar los reportes de las verificaciones
 * realizadas con el Sistema de Verificacion de IMRT.
 */
public class ReportePDF {

    private File directorio;

    public ReportePDF(String ruta, String archivo, Double cantPuntos, Double porcentPasoValor, String dtaU, String dosisU, String umbralU) throws FileNotFoundException, DocumentException {
        try {
            /*
             * Se genera el nombre del Reporte a crear, se asigna la ruta 
             * en donde se va a guardar, y se crea el documento para empezar
             * a escribirlo.
             */
            String nombre = archivo.substring(0, archivo.length() - 4);
            LectorArchivoPPF lector = new LectorArchivoPPF(ruta + "\\" + nombre.substring(0, nombre.length() - 3) + ".PPF");
            Vector<Vector> m = lector.AbrirArchivo();
            FileOutputStream archivos;
            
            directorio = new File(ruta + "\\Reportes");
            if (directorio.exists()) {
                archivos = new FileOutputStream(directorio + "\\" + nombre + ".pdf");
            } else {
                directorio.mkdir();
                archivos = new FileOutputStream(directorio + "\\" + nombre + ".pdf");
            }

            Document documento = new Document();
            PdfWriter writer = PdfWriter.getInstance(documento, archivos);

            //Rectangle para el encabezado del archivo
            Rectangle rct = new Rectangle(36, 54, 559, 788);
            //Definimos un nombre y un tamaño para el PageBox los nombres posibles son: “crop”, “trim”, “art” and “bleed”.
            writer.setBoxSize("art", rct);
            HeaderFooter event = new HeaderFooter();
            writer.setPageEvent(event);

            //abrimos nuestro documento para poder escribir en él.
            documento.open();
            documento.setPageSize(PageSize.A4);
            /*
             * Margenes
             * document.setMargins(36, 72, 108, 180);
             * document.setMarginMirroring(true);
             */

            //Datos del paciente, y datos a completar
            Paragraph datosP = new Paragraph();
            datosP.add("\nPaciente: " + lector.getNombrePaciente());
            datosP.add("\nID del Paciente: " + lector.getIdPaciente());
            datosP.add("\nDiagnóstico: " + lector.getDiagnosis());
            datosP.add("\nFecha de diagnóstico: " + lector.getDatePlan());
            datosP.add("\nTipo de Equipo: " + lector.getEquipo());
            Chunk density = new Chunk("Density Correction: " + lector.getD_correction());
            if (lector.getD_correction().equals("OFF")) {
                density.setBackground(BaseColor.RED);
            } 
            

            Paragraph i1 = new Paragraph("");

            /*
             * Imagenes de pantalla
             */

            // Imagen Verificador
            Image imgVerificador = new Image(Image.getInstance(ruta + "\\Otros\\" + nombre + "_dosis_Calc.jpg")) {
            };
            imgVerificador.setAlignment(Image.MIDDLE | Image.TEXTWRAP);
            imgVerificador.setAbsolutePosition(315, 430);
            imgVerificador.setBorder(Image.BOX);
            imgVerificador.setBorderWidth(10);
            imgVerificador.setBorderColor(BaseColor.BLACK);
            imgVerificador.scaleToFit(1000, 180);

            // Imagen Planificador
            Image imgPlanificador = new Image(Image.getInstance(ruta + "\\Otros\\" + nombre + "_dosis_TPS.jpg")) {
            };
            imgPlanificador.setAlignment(Image.LEFT | Image.TEXTWRAP);
            imgPlanificador.setAbsolutePosition(50, 430);
            imgPlanificador.setBorder(Image.BOX);
            imgPlanificador.setBorderWidth(10);
            imgPlanificador.setBorderColor(BaseColor.BLUE);
            imgPlanificador.scaleToFit(1000, 180);

            // Imagen Gamma
            Image imgGamma = new Image(Image.getInstance(ruta + "\\Otros\\" + nombre + "_indice_Gamma.jpg")) {
            };
            imgGamma.setAlignment(Image.MIDDLE | Image.UNDERLYING);
            imgGamma.setAbsolutePosition(315, 210);
            imgGamma.setBorder(Image.BOX);
            imgGamma.setBorderWidth(10);
            imgGamma.scaleToFit(1000, 180);

            /*
             * Pruebo crear e insertar un chunk con color 
             */
            Chunk dtaUChunk = new Chunk("\nDTA (En mm): " + dtaU + "\n");
            Chunk dosisUChunk = new Chunk("Dosis (En porcentaje): " + dosisU + "\n");
            Chunk umbralUChunk = new Chunk("Umbral (En porcentaje): " + umbralU + "\n_____________________________\n\n");

            Chunk pEval = new Chunk("Nº de puntos evaluados: " + cantPuntos.toString() + "\n");// +  + "\n");

            //Variable Float para probar
            //Se corrobora cual fue el porcentaje de puntos que pasaron, y segun
            //corresponda, se remarca el porcentaje y se colorea el borde de la
            //imagen Gamma, indicando si fue Bueno (Green/verde), Moderado 
            //(Yellow/amarillo), o Dudoso (Red/rojo).
            Chunk pasaron = new Chunk("Pasaron: " + porcentPasoValor.toString() + "%\n");

            if ((porcentPasoValor >= 90) && (porcentPasoValor <= 100)) {
                pasaron.setBackground(BaseColor.GREEN);
                imgGamma.setBorderColor(BaseColor.GREEN);
            } else {
                if ((porcentPasoValor >= 85) && (porcentPasoValor < 90)) {
                    pasaron.setBackground(BaseColor.YELLOW);
                    imgGamma.setBorderColor(BaseColor.YELLOW);
                } else if (porcentPasoValor < 85) {
                    pasaron.setBackground(BaseColor.RED);
                    imgGamma.setBorderColor(BaseColor.RED);
                }
            }
            //Completo el porcentraje de puntos que no pasaron
            Float noP = new Float(100 - porcentPasoValor);
            Float aux = new Float(Math.rint(noP * 1000) / 1000);
            noP = aux;
            Chunk noPasaron = new Chunk("No pasaron: " + noP.toString() + "%\n");

            //Se cargan las imagenes y sus títulos correspondientes.
            i1.add("\n Imagen Planificador                                                 Imagen IMRT-VeSoft");
            i1.add(imgPlanificador);
            i1.add(imgVerificador);
            i1.add("\n\n\n\n\n\n\n\n\n\n\n\n                                                                                   Imagen Gamma");
            i1.add(imgGamma);
            documento.add(new Paragraph("\n Reporte estudio\n"));
            documento.add(datosP);
            documento.add(density);
            documento.add(i1);
            documento.add(dtaUChunk);
            documento.add(dosisUChunk);
            documento.add(umbralUChunk);
            documento.add(pEval);
            documento.add(pasaron);
            documento.add(noPasaron);

            //Cerramos el documento creado.
            documento.close();

        } catch (FileNotFoundException ex) {
            throw ex;
        } catch (BadElementException ex) {
            Logger.getLogger(ReportePDF.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(ReportePDF.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ReportePDF.class.getName()).log(Level.SEVERE, null, ex);
        }


    }
}

class HeaderFooter extends PdfPageEventHelper {

    public void onEndPage(PdfWriter writer, Document document) {
        Rectangle rect = writer.getBoxSize("art"); //“crop”, “trim”, “art” and “bleed”
        //Aquí definimos el encabezado de nuestro documento PDF
        //Únicamente le ponemos nuestro nombre
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_RIGHT, new Phrase("Proyecto Final ISI - Burgos, Scarafia - IMRT"),
                rect.getRight(), rect.getTop(), 0);
        //Aquí definimos el pie de página de nuestro document PDF
        //lo que hace es poner el número de página a cada hoja del documento.
        ColumnText.showTextAligned(writer.getDirectContent(),
                Element.ALIGN_CENTER, new Phrase(String.format("página %d", writer.getPageNumber())),
                (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);
    }
}
